home *** CD-ROM | disk | FTP | other *** search
-
- /* putanim.c
- * opens an animation iff file by outputing the starting
- * bitmap. Then successive change frames may be output
- * followed by closing the file.
- *
- * written by G. Bonham May 1986
- * SPARTA, Inc.
- * Laguna Hills, Calif
- */
-
- #include "intuall.h"
- #include "gio.h"
- #include "ilbm.h"
- #include "putanim.h"
- #include "functions.h"
- #include "stdio.h"
-
- #define BODY_BUFSIZE 512
- #define MaxDepth 5
-
- #define CkErr(exp) {if(ifferror==IFF_OKAY)ifferror=(exp);}
-
- extern UBYTE BMmask;
- extern int Pop;
- GroupContext fileC, form1C, form2C;
- static IFFP ifferror = 0;
- BYTE *Bufsave;
- LONG Bufsizesave;
- static UWORD bHw,bHh;
- static WORD bHx,bHy;
-
- /* =================================================== */
-
- BOOL OpenAnim(file,bm,pageW,pageH,colorMap,modes,buffer,bufsize)
- UWORD modes;
- LONG file;
- struct BitMap *bm;
- WORD pageW,pageH;
- WORD *colorMap;
- BYTE *buffer; LONG bufsize;
- {
- UBYTE depth;
- BitMapHeader bmHdr;
- ULONG lmodes;
-
- lmodes = modes;
- ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1
- ,0,pageW,pageH);
-
- if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
- if (ifferror == IFF_OKAY && bufsize > 2 * BODY_BUFSIZE) {
- if (GWriteDeclare(file,buffer+BODY_BUFSIZE
- ,(long)(bufsize-BODY_BUFSIZE)) < 0)
- ifferror = DOS_ERROR;
- bufsize = BODY_BUFSIZE;
- }
-
- depth = bm->Depth;
- if (depth > 5) depth = 5;
- CkErr(OpenWIFF(file,&fileC,(long)szNotYetKnown));
- CkErr(StartWGroup(&fileC,(ID)FORM,(long)szNotYetKnown,ID_ANIM,&form1C));
- CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
- CkErr(PutCk(&form2C,ID_BMHD,(long)sizeof(BitMapHeader),(BYTE *)&bmHdr));
- if (colorMap) CkErr(PutCMAP(&form2C,colorMap,depth));
- CkErr(PutCk(&form2C,ID_CAMG,(long)sizeof(CamgChunk),(BYTE *)&lmodes));
- CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
- CkErr(EndWGroup(&form2C));
- CkErr(CloseWGroup(&form1C));
- if(ifferror != IFF_OKAY) printf("openanim - iff error: %d\n",ifferror);
- return((BOOL)(ifferror != IFF_OKAY));
- }
-
- BOOL AddAnim(bm,pageW,pageH,pop,buffer,bufsize)
-
- struct BitMap *bm;
- WORD pageW,pageH,pop;
- BYTE *buffer;
- LONG bufsize;
-
- {
- AnimationHeader animHdr;
- BitMapHeader bmHdr;
-
- /* InitBMHdr sets w and h and x and y in bmHdr */
- Pop = pop;
- ifferror = InitBMHdr(&bmHdr,bm,(WORD)mskNone,(WORD)cmpByteRun1
- ,0,pageW,pageH);
- bHx = bmHdr.x;
- bHy = bmHdr.y;
- bHw = bmHdr.w;
- bHh = bmHdr.h;
-
- ifferror = InitAnimHdr(&animHdr,pop);
- if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
-
- CkErr(OpenWGroup(&fileC,&form1C));
- CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
- CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
- CkErr(PutBODY(&form2C,bm,(long)NULL,&bmHdr,buffer,(long)bufsize));
- CkErr(EndWGroup(&form2C));
- CkErr(CloseWGroup(&form1C));
- if(ifferror != IFF_OKAY) printf("addanim - iff error: %d\n",ifferror);
- return((BOOL)(ifferror != IFF_OKAY));
- }
-
- BOOL AddAnim2(data,ndata,pop)
- int pop;
- LONG *data;
- LONG ndata;
- {
- AnimationHeader animHdr;
-
- ifferror = InitAnimHdr(&animHdr,pop);
- if(ifferror != IFF_OKAY) printf("iff error: %d\n",ifferror);
-
- CkErr(OpenWGroup(&fileC,&form1C));
- CkErr(StartWGroup(&form1C,(ID)FORM,(long)szNotYetKnown,ID_ILBM,&form2C));
- CkErr(PutCk(&form2C,ID_ANHD,(long)sizeof(AnimationHeader),(BYTE *)&animHdr));
- CkErr(PutCk(&form2C,ID_DLTA,ndata,data));
- CkErr(EndWGroup(&form2C));
- CkErr(CloseWGroup(&form1C));
- if(ifferror != IFF_OKAY) printf("addanim - iff error: %d\n",ifferror);
- return((BOOL)(ifferror != IFF_OKAY));
- }
-
- BOOL CloseAnim(file)
-
- LONG file;
-
- {
- Pop = 0;
- CkErr(PutCkEnd(&fileC));
- CkErr(CloseWGroup(&fileC));
- if (GWriteUndeclare(file) < 0 && ifferror == IFF_OKAY) ifferror = DOS_ERROR;
- return ((BOOL)(ifferror != IFF_OKAY));
- }
-
- BOOL InitAnimHdr(aH,op)
- AnimationHeader *aH;
- WORD op;
-
- {
- int i;
-
- aH->operation = op;
- aH->mask = 0;
- aH->x = 0;
- aH->y = 0;
- aH->w = 0;
- aH->h = 0;
- aH->interleave = 0;
- aH->reltime = 0;
- aH->abstime = 0;
- aH->bits = 0;
- aH->pad0 = 0;
- for (i=0;i<16;i++) aH->pad[i] = 0;
- return(0);
-
- }
-
-